package GUI;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;

import Reproductor.Almacen;
import Reproductor.Cancion;
import Reproductor.Reproductor;

public class PanelReproductor extends JPanel{
	
	 /**
	  * Declaracion de atributos de la clase PanelReproductor
	  */
	private Reproductor reproductor;
	private JSlider desplazamiento;
	private JLabel tiempos;
	private boolean estaTiempoRestante=false;
	private JLabel cancionSonando;
	private int numCancionSonando=-1;
	private Almacen almacenCanciones;
	private boolean estaSilenciado=false;
	private JButton botonSilencio;
	private JSlider volumen;
	
	/**
	 * Inicializa todos los elementos del panel reproductor.
	 * @param almacen: almacen que va a servir para inicializar el del reproductor
	 */
	public PanelReproductor(Almacen almacen){
		
		almacenCanciones=almacen;
		reproductor = new Reproductor();	
		setLayout(null);
		
		cancionSonando = new JLabel();
		cancionSonando.setBounds(25, 13, 225, 30);
		add(cancionSonando);
		
		desplazamiento = new JSlider();
		desplazamiento.setBounds(255, 5, 300, 50);
		desplazamiento.setValue(0);
		accionBarra(desplazamiento);
		add(desplazamiento);
		
		volumen = new JSlider();
		volumen.setBounds(85, 55, 100, 50);
		volumen.setValue(100);
		reproductor.cambiarVolumen(1);
		accionVolumen(volumen);
		add(volumen);
		
		tiempos = new JLabel();
		tiempos.setBounds(570, 13, 100, 30);
		tiempos.addMouseListener(new java.awt.event.MouseListener(){
			public void mouseReleased(MouseEvent e) {}
			public void mouseClicked(MouseEvent e) {
				if (reproductor.getCancionCargada()){
					estaTiempoRestante=!estaTiempoRestante;
					reproductor.modificarTiempos(estaTiempoRestante, tiempos);
					reproductor.moverBarra(desplazamiento, tiempos);
				}
			}
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
			public void mousePressed(MouseEvent e) {}
		});
		
		add(tiempos);
		
		reproductor.moverBarra(desplazamiento, tiempos);
		
		JButton botonAnterior = new JButton();
		ImageIcon iconoAnterior = new ImageIcon("Iconos/Anterior.png");
		botonAnterior.setIcon(iconoAnterior);
		botonAnterior.setBorderPainted(false);
		botonAnterior.setBounds(275, 60, 38, 38);
		accionAnterior(botonAnterior);
		add(botonAnterior);
		
		JButton botonPlay = new JButton();
		ImageIcon iconoPlay = new ImageIcon("Iconos/Play.png");
		botonPlay.setIcon(iconoPlay);
		botonPlay.setBorderPainted(false);
		botonPlay.setBounds(330, 60, 38, 38);
		accionPlayPause(botonPlay);
		add(botonPlay);
		
		JButton botonPause = new JButton();
		ImageIcon iconoPause = new ImageIcon("Iconos/Pause.png");
		botonPause.setIcon(iconoPause);
		botonPause.setBorderPainted(false);
		botonPause.setBounds(385, 60, 38, 38);
		accionPause(botonPause);
		add(botonPause);
		
		JButton botonStop = new JButton();
		ImageIcon iconoStop = new ImageIcon("Iconos/Stop.png");
		botonStop.setIcon(iconoStop);
		botonStop.setBorderPainted(false);
		botonStop.setBounds(440, 60, 38, 38);
		accionStop(botonStop);
		add(botonStop);
		
		JButton botonSiguiente = new JButton();
		ImageIcon iconoSiguiente = new ImageIcon("Iconos/Siguiente.png");
		botonSiguiente.setIcon(iconoSiguiente);
		botonSiguiente.setBorderPainted(false);
		botonSiguiente.setBounds(495, 60, 38, 38);
		accionSiguiente(botonSiguiente);
		add(botonSiguiente);
		
		botonSilencio = new JButton();
		cambiarIconoSilencio();
		botonSilencio.setBorderPainted(false);
		botonSilencio.setBounds(40, 60, 38, 38);
		accionSilencio(botonSilencio);
		add(botonSilencio);
			
		setEnabled(true);
		setVisible(true);
		validate();
	}
	
	/**
	 * Devuelve si queda tiempo restante o no.
	 * @return: true si queda, false si no queda.
	 */
	public boolean getEstaTiempoRestante(){
		return estaTiempoRestante;
	}

	/**
	 * Crea un oyente para la barra de desplazamiento, para poder avanzar o rebobinar 
	 * desde ella.
	 * @param b:boton para el silencio ya creado.
	 */
	public void accionBarra(final JSlider s){
		s.addMouseListener(new java.awt.event.MouseListener(){
			public void mouseReleased(MouseEvent e) {
				int x = e.getX();
				if(x<0){
					x=0;
				}
				x=x/3;
				System.out.println("cuanto vale x??  "+x);
				reproductor.rebobinar(x,desplazamiento,tiempos);
			}
			public void mouseClicked(MouseEvent e) {}
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
			public void mousePressed(MouseEvent e) {}
		});
	}
	
	/**
	 * Crea un oyente para el la barra de volumen
	 * @param s: barra de volumen ya creada.
	 */
	public void accionVolumen(final JSlider s){
		s.addMouseListener(new java.awt.event.MouseListener(){
			public void mouseReleased(MouseEvent e) {
				float x = e.getX();
				if(x<0){
					x=0;
				}
				if(x>100){
					x=100;
				}
				volumen.setValue((int)x);
				reproductor.cambiarVolumen(x/100);
			}
			public void mouseClicked(MouseEvent e) {}
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
			public void mousePressed(MouseEvent e) {}
		});
	}
	
	/**
	 * Crea un oyente para el boton reproducir.
	 * @param b:boton para reproducir la cancion ya creado.
	 */
	public void accionPlayPause(JButton b){
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				reproductor.Play();
			}
		});
	}
	
	/**
	 * Crea un oyente para el boton pausar.
	 * @param b:boton para pausar la cancion ya creado.
	 */
	public void accionPause(JButton b){
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				reproductor.Pause();
			}
		});
	}
	
	/**
	 * Crea un oyente para el boton parar.
	 * @param b:boton para parar la cancion ya creado.
	 */
	public void accionStop(JButton b){
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				reproductor.Stop(desplazamiento,tiempos);
			}
		});
	}
	
	/**
	 * Crea un oyente para el boton anterior.
	 * @param b:boton para volver a la anterior cancion ya creado.
	 */
	public void accionAnterior(JButton b){
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if (numCancionSonando>0){
					almacenCanciones.getCancionListaReproduccion(numCancionSonando).setSonando(false);
					//Pasamos a la anterior
					numCancionSonando--;				
					Cancion c = almacenCanciones.getCancionListaReproduccion(numCancionSonando);
					setReproductor(c);
					activarReproduccion();
				}
			}
		});
	}
	
	/**
	 * Crea un oyente para el boton siguiente.
	 * @param b:boton para pasar de cancion ya creado.
	 */
	public void accionSiguiente(JButton b){
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if (numCancionSonando<almacenCanciones.getListaReproduccion().size()-1 && numCancionSonando>-1){
					almacenCanciones.getCancionListaReproduccion(numCancionSonando).setSonando(false);
					//Pasamos a la siguiente
					numCancionSonando++;					
					Cancion c = almacenCanciones.getCancionListaReproduccion(numCancionSonando);
					setReproductor(c);
					activarReproduccion();
				}
			}
		});
	}
	
	/**
	 * Crea un oyente para el boton silencio.
	 * @param b:boton para el silencio ya creado.
	 */
	public void accionSilencio(JButton b){
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				estaSilenciado=!estaSilenciado;
				reproductor.silenciar(estaSilenciado);
				cambiarIconoSilencio();
			}
		});
	}
	
	/**
	 * Toma informacion para la reproduccion a traves de informacion que contiene la
	 * cancion que se quiere reproducir.
	 * @param c: cancion que queremos reproducir.
	 */
	public void setReproductor(Cancion c){
		
		reproductor.setReproductor(c.getDireccionURL(),desplazamiento,tiempos);
		numCancionSonando=almacenCanciones.numCancionSonando(c);		
		almacenCanciones.getCancionListaReproduccion(numCancionSonando).setSonando(true);
		cancionSonando.setText(c.getTitulo());
		
	}

	/**
	 * Cambia la imagen del boton del sonido por otra que representa el silencio, y 
	 * viceversa.
	 */
	public void cambiarIconoSilencio(){
		ImageIcon iconoNoSilencio = new ImageIcon("Iconos/NoSilencio.png");
		ImageIcon iconoSilencio = new ImageIcon("Iconos/Silencio.png");
		if(estaSilenciado){
			botonSilencio.setIcon(iconoSilencio);
		}
		else{
			botonSilencio.setIcon(iconoNoSilencio);
		}
	}
	
	/**
	 * Comienza a reproducir la cancion.
	 */
	public void activarReproduccion(){
		reproductor.Play();
	}
	
}
